import * as vscode from 'vscode';
import {dedent} from "../../../utils";

// documentation中使用了代码块，代码块中写的事makedown格式，首行不能为空
let slItems = [
    {
        "label": "RegisterLuaNetMsg",
        "insertText": dedent`
        function \${2:networkCB}(msgID, n1, n2, n3, recvStr)

        end

        SL:RegisterLuaNetMsg(\${1:msgID}, \${2:networkCB})
        `,
        "documentation": dedent`# 网络-接收网络消息 
        [在线文档]（http://engine-doc.996m2.com/web/#/22/2245）
        服务器使用Lua的技术
        
        | 参数名    | 必选 | 类型     | 说明                                         |
        | :-------- | :--- | :------- | -------------------------------------------- |
        | msgID     | 是   | int      | 消息ID                                       |
        | networkCB | 是   | function | 接收消息的函数回调                           |
        | widget    | 否   | obj      | 绑定的界面(win)对象， 界面关闭则注销接收回调 |

        `
    },
    {
        "label": "UnRegisterLuaNetMsg",
        "insertText": dedent`
        SL:UnRegisterLuaNetMsg(\${1:msgID})
        `,
        "documentation": dedent`# 网络-注销网络消息接收 
        [在线文档]（http://engine-doc.996m2.com/web/#/22/2245）
        服务器使用Lua的技术

        `
    },
    {
        "label": "SendLuaNetMsg",
        "insertText": dedent`
        SL:SendLuaNetMsg(\${1:100}, \${2:1}, \${3:2}, \${4:3}, \${5:"Hello World, This engine, for Lua!"})
        `,
        "documentation": dedent`# 网络-发送网络消息 
        [在线文档]（http://engine-doc.996m2.com/web/#/22/2245）

        服务器使用Lua的技术

        Lua脚本接收客户端消息，代码写在 QFunction-0.lua
        Lua自定义消息统一执行：handlerequest(actor, msgID, param1, param2, param3, str)
        比如客户端发送消息号100

        -- Lua脚本 接收消息
        function handlerequest(actor, msgID, param1, param2, param3, str)
            release_print("-----------------------------")
            release_print(msgID)
            release_print(param1)
            release_print(param2)
            release_print(param3)
            release_print(str)
        end

        -- 客户端执行 发送消息
        SL:SendLuaNetMsg(100, 1, 2, 3, "Hello World, This engine, for Lua!")

        Lua脚本发送消息给客户端，支持 3个int和1个字符串，使用 sendluamsg
        客户端注册对应消息号
        比如脚本发送消息号1000

        -- 客户端注册 接收消息
        local function networkCB(msgID, p1, p2, p3, msgData)
            SL:Print(msgID, p1, p2, p3, msgData)
        end
        SL:RegisterLuaNetMsg(1000, networkCB)

        -- Lua脚本执行
        sendluamsg(actor, 1000, 1, 2, 3, "我是来自服务器的消息 By Lua")

        `
    },


    {
        "label": "RegisterNetMsg",
        "insertText": dedent`
        function \${2:networkCB}(msgID, n1, n2, n3, recvStr)

        end

        SL:RegisterNetMsg(\${1:msgID}, \${2:networkCB})
        `,
        "documentation": dedent`# 网络-接收网络消息 
        [在线文档]（http://engine-doc.996m2.com/web/#/22/2245）
        服务器使用TXT的技术
        
        | 参数名    | 必选 | 类型     | 说明                                         |
        | :-------- | :--- | :------- | -------------------------------------------- |
        | msgID     | 是   | int      | 消息ID                                       |
        | networkCB | 是   | function | 接收消息的函数回调                           |
        | widget    | 否   | obj      | 绑定的界面(win)对象， 界面关闭则注销接收回调 |

        `
    },
    {
        "label": "UnRegisterNetMsg",
        "insertText": dedent`
        SL:UnRegisterNetMsg(\${1:msgID})
        `,
        "documentation": dedent`# 网络-注销网络消息接收 
        [在线文档]（http://engine-doc.996m2.com/web/#/22/2245）
        服务器使用TXT的技术

        `
    },
    {
        "label": "SendNetMsg",
        "insertText": dedent`
        SL:SendNetMsg(\${1:100}, \${2:1}, \${3:2}, \${4:3}, \${5:"Hello World, This engine, for TXT!"})
        `,
        "documentation": dedent`# 网络-发送网络消息 
        [在线文档]（http://engine-doc.996m2.com/web/#/22/2245）

        服务器使用TXT的技术

        注意！！！ 一个 msgID 只能注册一个回调

        TXT脚本接收客户端消息，代码写在 QFunction-0.txt
        TXT自定义消息监听触发：Message_xxx, xxx 为消息号ID
        比如客户端发送消息号100
        ;接收来自客户端的消息号 100
        [@Message_100]
        #ACT
        SENDMSG 0 收到消息，<$PARAM1>, <$PARAM2>, <$PARAM3>, <$CUSTMSGPARAM>

        -- 客户端执行 发送消息
        SL:SendNetMsg(100, 1, 2, 3, "Hello World, This engine, for TXT!")

        TXT脚本发送消息给客户端，支持发字符串，使用 SENDCUSTMSG
        客户端注册对应消息号
        比如脚本发送消息号1000

        -- 客户端注册 接收消息
        local function networkCB(msgID, msgData)
            SL:Print(msgID)
            SL:Print(msgData)
        end
        SL:RegisterNetMsg(1000, networkCB)

        TXT脚本执行
        SENDCUSTMSG 1000 我是来自服务器的消息, By TXT

        `
    },


]


export function getCompletionItems(): vscode.CompletionItem[] {


    const completionItems: vscode.CompletionItem[] = [];
    slItems.forEach((item: any) => {
        completionItems.push(createFunctionCompletionItem(item.label, item.insertText, item.documentation));
    });
    return completionItems;
}

function createFunctionCompletionItem(label: string, insertText: string, documentation?: string): vscode.CompletionItem {
    const item = new vscode.CompletionItem(label, vscode.CompletionItemKind.Function);
    item.insertText = new vscode.SnippetString(insertText);
    if (documentation) {
        item.documentation = new vscode.MarkdownString(documentation);
    }
    return item;
}
